package com.zeyu.soc.log;

import java.io.File;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.util.Map;
import java.util.jar.JarFile;

import com.zeyu.soc.log.interactive.system.VMSocketServer;
import com.zeyu.soc.log.profiler.Profiler;
import com.zeyu.soc.log.tools.Trace;
import com.zeyu.soc.log.utils.ArgusUtils;

public class LogAgent {

	// ================================================================
	// Constants
	// ================================================================

	// ================================================================
	// Fields
	// ================================================================

	// ================================================================
	// Constructors
	// ================================================================

	// ================================================================
	// Methods from/for super Interfaces or SuperClass
	// ================================================================

	// ================================================================
	// Public or Protected Methods
	// ================================================================

	// 全局代理方法
	public static void agentmain(String args, Instrumentation inst) throws UnmodifiableClassException,
			ClassNotFoundException, IOException {
		try {
			Map<String, String> argusMap = ArgusUtils.args2map(args);
			// here need to add systemclassloader ,or the javassist can not
			// compiler,the javassist's bug?
			// resin容器也需要加到这里才可以，tomcat不用
			initSystemClassPath(inst, argusMap);
			initTools(inst, argusMap);
			startupSocketServer(inst, argusMap);
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	// ================================================================
	// Getter & Setter
	// ================================================================

	// ================================================================
	// Private Methods
	// ================================================================

	private static void startupSocketServer(Instrumentation inst, Map<String, String> argusMap) {
		int port = Integer.valueOf(argusMap.get("port"));
		VMSocketServer server = new VMSocketServer(port, inst);
		server.start();
	}

	private static void initTools(Instrumentation inst, Map<String, String> argusMap) {
		String vmLogFilePath = new File("").getAbsolutePath() + File.separator + argusMap.get("thispid") + ".log";
		System.out.println(vmLogFilePath);
		Trace.init(vmLogFilePath);
		Profiler.init(Trace.out);
	}

	private static void initSystemClassPath(Instrumentation inst, Map<String, String> argusMap) {
		String bootsharps = argusMap.get("systemJars");
		System.out.println("####bootsharps=" + bootsharps);
		if (null != bootsharps && !bootsharps.equals("")) {
			String[] jarFiles = bootsharps.split("&");
			if (null != jarFiles && jarFiles.length > 0) {
				for (String jarFile : jarFiles) {
					try {
						if (jarFile.contains(".jar")) {
							System.out.println("adding jarFile to bootsharp:" + jarFile);
							inst.appendToSystemClassLoaderSearch(new JarFile(jarFile));
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

	// ================================================================
	// Inner or Anonymous Class
	// ================================================================

	// ================================================================
	// Test Methods
	// ================================================================
}
